table of contents
SIGWAITINFO(2) | Руководство программиста Linux | SIGWAITINFO(2) |
ИМЯ¶
sigwaitinfo, sigtimedwait - синхронно ожидать запрошенные сигналы
ОБЗОР¶
#include <signal.h> int sigwaitinfo(const sigset_t *set, siginfo_t *info); int sigtimedwait(const sigset_t *set, siginfo_t *info, const struct timespec *timeout);
Требования
макроса
тестирования
свойств
для glibc (см.
feature_test_macros(7)):
sigwaitinfo(), sigtimedwait(): _POSIX_C_SOURCE >= 199309L
ОПИСАНИЕ¶
sigwaitinfo() приостанавливает исполнение вызывающий нити до тех пор, пока не будет получен один из сигналов из набора set. ((Если один из сигналов в set уже ожидает обработки вызывающей нитью, то sigwaitinfo() завершит работу немедленно с возвратом информации об этом сигнале.)
sigwaitinfo() удаляет доставленный сигнал из списка сигналов для обработки и возвращает номер сигнала как результат работы функции. Если аргумент info не равен NULL, то возвращается структура типа siginfo_t (см. sigaction(2)), содержащая информацию о сигнале.
Сигналы, возвращенные через sigwaitinfo(), доставляются обычным порядком; подробности можно прочитать в signal(7).
Системный вызов sigtimedwait() работает аналогично sigwaitinfo(), за исключением того, что он имеет дополнительный аргумент timeout, задающий минимальный интервал, на который приостанавливается процесс в ожидании сигнала. Данное значение интервала будет округлено до точности системных часов, а из-за задержки при планировании в ядре блокирующий интервал будет немного больше. Этот аргумент имеет следующий тип:
struct timespec {
long tv_sec; /* секунды */
long tv_nsec; /* наносекунды */ }
Если оба поля структуры равны 0, то исполняется опрос: sigtimedwait() немедленно завершает работу, либо с информацией о сигнале, предназначенном вызывающему, либо с ошибкой, если ни один из сигналов в наборе set не ожидает обработки.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ¶
При нормальном завершении работы sigwaitinfo() и sigtimedwait() возвращают номер сигнала (т.е. значение больше нуля). При ошибках оба вызова возвращают -1 и переменная errno устанавливается соответственно ошибке.
ОШИБКИ¶
СООТВЕТСТВИЕ СТАНДАРТАМ¶
POSIX.1-2001.
ЗАМЕЧАНИЯ¶
При обычном использовании вызывающая программа блокирует сигналы в наборе set через предыдущий вызов sigprocmask(2) (так, чтобы поведение по умолчанию для этих сигналов не сработает, если они доставлены между успешными вызовами sigwaitinfo() или sigtimedwait()) и не устанавливает обработчики для этих сигналов. В многонитиевых программах сигнал должен быть заблокирован во всех нитях для предотвращения возврата сигнала нити, отличной от той, которая вызвала sigwaitinfo() или sigtimedwait()).
Набор сигналов, ожидающих обработки в заданной нити, представляет собой объединение набора сигналов, ожидающих обработки именно в этой нити и набора сигналов, ожидающих обработки всем процессом (см. signal(7)).
Попытки ожидания SIGKILL и SIGSTOP просто игнорируются.
Если несколько нитей процесса заблокированы в ожидании одного сигнала(ов) в sigwaitinfo() или sigtimedwait(), то только одна нить действительно получить сигнал, если он доставляется всему процессу; какая именно нить получит сигнал неизвестно.
POSIX оставляет неопределённое значение NULL в аргументе timeout для sigtimedwait(), допуская возможность того, что он имеет такое же значение, как и у вызова sigwaitinfo(), и в самом деле это именно так в Linux.
В Linux, sigwaitinfo() реализована в виде библиотечной функции, использующей sigtimedwait().
СМОТРИТЕ ТАКЖЕ¶
kill(2), sigaction(2), signal(2), signalfd(2), sigpending(2), sigprocmask(2), sigqueue(3), sigsetops(3), sigwait(3), signal(7), time(7)
2012-05-02 | Linux |